//引入vue vue-router
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '@/store'

// 注册插件
Vue.use(VueRouter)


// 重写push和replace方法
// 保存原push和replace方法
const original_push=VueRouter.prototype.push
const original_replace=VueRouter.prototype.replace

// location参数为往哪儿跳
// resolve和reject参数为回调函数，用来处理异步操作的结果
// call方法改变this指向
VueRouter.prototype.push=function (location,resolve,reject){
  if(resolve && reject){
    original_push(location,resolve,reject)
  }else{
    // 如果不用call那么original_push指向会指向windos对象，而不是VueRouter对象
    original_push.call(this,location,()=>{},()=>{})
  }
}
VueRouter.prototype.replace=function (location,resolve,reject){
  if(resolve && reject){
    original_replace(location,resolve,reject)
  }else{
    original_replace.call(this,location,()=>{},()=>{})
  }
}

// 导入路由信息
import routes from '@/router/routes'

// 定义路由
const router = new VueRouter({
  routes,
  // 平滑滚动
  scrollBehavior(to, from, savedPosition) {
    return{y:0}
  }
})

// 全局前置路由守卫
router.beforeEach(async(to,from,next)=>{
  // 测试
  // next()
  // 第一步判断是否登录
  const token=store.state.user.token
  const name=store.state.user.userInfo.name
  if(token){
    //如果登录了，则判断是否是去登录页
    if(to.name == 'login'){
      // 如果是去登录页,直接跳转首页
      next('/')
    }else{
      // 如果不是去登录页，则判断是否有用户信息
      if(name){
        // 如果有用户信息，则放行
        next()
      }else{
        // 如果没有用户信息，则去请求用户信息,再次放行
        // console.log('没有用户信息');
      try{
        await store.dispatch('user/getUserInfo')
        next()
      }catch(e){
        // 如果请求失败（token失效），则退出登录,跳转登录页
        store.dispatch('user/userLogout')
        next('/login')
      }
      }
    }
  }else{
    // 如果没有登录，判断去哪儿
    let toPath=to.path
    // 如果去的这几个组件
    if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1||toPath.indexOf('/center')!=-1){
        //跳转登录页,在登录进行判定有无query参数在进行跳转
        next('/login?redirect='+toPath)  
    }else{
      // 除了上面几个组件，其他的放行
      next()
    }
  }
})

// 导出路由
export default router 